package com.youbar.service.tools;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.youbar.common.Config;
import com.youbar.dto.LoginInfoDto;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.util.concurrent.TimeUnit;

/**
 * 用户登录信息缓存
 */
@Service("userCache")
public class UserCache {

    private static Cache<String, LoginInfoDto> cache;

    public static final String CACHE_PREFIX = "user:";

    /**
     * 获取指定用户的登录信息
     * @return
     */
    public Cache<String, LoginInfoDto> getCache() {
        if (cache == null) {
            cache = CacheBuilder.newBuilder()
                    //设置cache的初始大小为10
                    .initialCapacity(10)
                    //设置并发数为5，即同一时间最多只能有5个线程往cache执行写入操作
                    .concurrencyLevel(5)
                    //设置cache中的数据在写入之后的存活时间为 loginInforTime 秒
                    .expireAfterWrite(7200, TimeUnit.SECONDS)
                    //构建cache实例
                    .build();
        }
        return cache;
    }

    /**
     * 获取用户登录信息
     * @param userId
     * @return
     */
    public LoginInfoDto get(String userId) {
        Assert.notNull(userId);
        Object obj = getCache().getIfPresent(assembleKey(userId));
        if (obj != null) {
            return (LoginInfoDto) obj;
        }
        return null;
    }

    /**
     * 添加用户登录信息
     * @param userId
     * @param user
     * @return
     */
    public boolean add(String userId, LoginInfoDto user) {
        getCache().put(assembleKey(userId), user);
        return true;
    }

    /**
     * 删除用户登录信息
     * @param userId
     * @return
     */
    public boolean del(String userId) {
        getCache().invalidate(assembleKey(userId));
        return true;
    }

    /**
     * 清除数据
     * @return
     */
    public boolean flushDB() {
        getCache().invalidateAll();
        return true;
    }

    /**
     * 新增
     * @param userId
     * @return
     */
    private String assembleKey(String userId) {
        return CACHE_PREFIX + userId;
    }
}
